'''计算两个数的最大公约数'''
# '''暴力枚举法，计算次数太多'''
def GCDamong(a, b):                   # a放小的数，b放大的数
    for i in range(a,0,-1):           # 反向遍历[2,a]
        if a % i == 0 and b % i == 0:
            break                     #已得到最大公约数后跳出循环
    if i == 1:                        #若循环到最后仍无最大公约数则i=1
       return i
    return i

# '''辗转相除法'''
def GCD(a,b):
    big = max(a,b)
    small = min(a,b)
    if big%small==0:
        return small
    return GCD(big%small,small)


if __name__ == '__main__':
    print(GCD(99, 33))
    print(GCDamong(11, 99))


'''求多个数的最大公约数，相当于不断的迭代，用前面两个数求得的gcd再和后面的数一起再求gcd，一直到最后一个数和之前求得的gcd在进行gcd运算，
最后得到的gcd就是这一堆数的最大公约数   简言之 gcd(a,b,c) = gcd( gcd(a,b) , c )'''
# def gcd2(*args):
#     res=gcd(gcd(args[0],args[1]))
#     for i in range(2,len(args)):
#         res=gcd(res,args[i])
#     return res
lst=[100,50,25,75]
def GCD_All(lst):   #参数为一个列表
    gcd=GCD(lst[0],lst[1])
    for i in range(2,len(lst)-1):
       gcd=GCD(gcd,lst[i])
    return gcd
print( GCD_All(lst) )

'''可以调用多维数组中的参数'''
lst2=[[1,100],[2,50],[3,25],[4,75]]
def GCD_All(lst):   #参数为一个二维列表
    gcd = GCD(lst[0][1], lst[1][1])
    for i in range(2,len(lst)-1):
        gcd = GCD(gcd, lst[i][1])
    return gcd
print( GCD_All(lst2) )


